diff --git a/ice/Makefile b/ice/Makefile
index 16ec261..8b2034b 100644
--- a/ice/Makefile
+++ b/ice/Makefile
@@ -26,9 +26,9 @@ ifneq ($(KERNELRELEASE),)
 ccflags-y += -I$(src)
 subdir-ccflags-y += -I$(src)
 
-obj-m += ice.o
+obj-m += ice$(NETMAP_DRIVER_SUFFIX).o
 
-ice-y := ice_main.o	\
+ice$(NETMAP_DRIVER_SUFFIX)-y := ice_main.o	\
 	 ice_controlq.o	\
 	 ice_common.o	\
 	 ice_nvm.o	\
@@ -70,13 +70,13 @@ ice-y := ice_main.o	\
 	 ice_ieps.o		\
 	 ice_gnss.o		\
 	 ice_ethtool.o
-ice-$(CONFIG_NET_DEVLINK:m=y) += ice_devlink.o ice_fw_update.o
-ice-$(CONFIG_NET_DEVLINK:m=y) += ice_eswitch.o ice_repr.o
-ice-y += ice_peer_support.o
-ice-y += ice_idc.o
-ice-$(CONFIG_DEBUG_FS) += ice_debugfs.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_NET_DEVLINK:m=y) += ice_devlink.o ice_fw_update.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_NET_DEVLINK:m=y) += ice_eswitch.o ice_repr.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += ice_peer_support.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += ice_idc.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_DEBUG_FS) += ice_debugfs.o
 
-ice-$(CONFIG_PCI_IOV) +=		\
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_PCI_IOV) +=		\
 	ice_dcf.o			\
 	ice_sriov.o			\
 	ice_vf_mbx.o			\
@@ -89,37 +89,37 @@ ice-$(CONFIG_PCI_IOV) +=		\
 	ice_vf_lib.o
 
 ifneq (${ENABLE_SIOV_SUPPORT},)
-ice-$(CONFIG_VFIO_MDEV:m=y) += ice_vdcm.o ice_siov.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_VFIO_MDEV:m=y) += ice_vdcm.o ice_siov.o
 endif
-ice-$(CONFIG_PTP_1588_CLOCK:m=y) += ice_ptp.o ice_ptp_hw.o
-ice-$(CONFIG_DCB) += ice_dcb.o ice_dcb_nl.o ice_dcb_lib.o
-ice-$(CONFIG_RFS_ACCEL) += ice_arfs.o
-ice-$(CONFIG_XDP_SOCKETS) += ice_xsk.o
-ice-y += kcompat.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_PTP_1588_CLOCK:m=y) += ice_ptp.o ice_ptp_hw.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_DCB) += ice_dcb.o ice_dcb_nl.o ice_dcb_lib.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_RFS_ACCEL) += ice_arfs.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_XDP_SOCKETS) += ice_xsk.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += kcompat.o
 # Use kcompat pldmfw.c if kernel does not provide CONFIG_PLDMFW
 ifndef CONFIG_PLDMFW
-ice-y += kcompat_pldmfw.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += kcompat_pldmfw.o
 endif
 # Use kcompat DIMLIB if kernel doesn't provide it
 ifndef CONFIG_DIMLIB
-ice-y += kcompat_dim.o kcompat_net_dim.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += kcompat_dim.o kcompat_net_dim.o
 endif
 # Use kcompat GNSS if kernel doesn't provide it
 ifneq (${CONFIG_GNSS}, y)
 ifneq (${CONFIG_GNSS}, m)
-ice-y += kcompat_gnss.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += kcompat_gnss.o
 endif
 endif
 
 ifeq (${CONFIG_SUSE_KERNEL}, y)
-ice-y += kcompat_gnss.o
+ice$(NETMAP_DRIVER_SUFFIX)-y += kcompat_gnss.o
 endif
 
 ifneq (${ENABLE_LM_SUPPORT},)
 obj-$(CONFIG_VFIO_PCI_CORE:y=m) += ice-vfio-pci.o
 
-ice-vfio-pci-y := ice_vfio_pci.o
-ice-$(CONFIG_VFIO_PCI_CORE:m=y) += ice_migration.o
+ice$(NETMAP_DRIVER_SUFFIX)-vfio-pci-y := ice_vfio_pci.o
+ice$(NETMAP_DRIVER_SUFFIX)-$(CONFIG_VFIO_PCI_CORE:m=y) += ice_migration.o
 endif
 
 
@@ -131,7 +131,7 @@ endif
 else	# ifneq($(KERNELRELEASE),)
 # normal makefile
 
-DRIVER := ice
+DRIVER := ice$(NETMAP_DRIVER_SUFFIX)
 
 COMMON_MK ?= $(wildcard common.mk)
 ifeq (${COMMON_MK},)
@@ -172,7 +172,7 @@ endif
 
 all:
 	+$(call kernelbuild,modules)
-	@gzip -c ../${DRIVER}.${MANSECTION} > ${DRIVER}.${MANSECTION}.gz
+	##@gzip -c ../${DRIVER}.${MANSECTION} > ${DRIVER}.${MANSECTION}.gz
 ifneq ($(wildcard lttng),)
 	$(MAKE) -C lttng
 endif
@@ -217,7 +217,7 @@ ifneq (${DDP_PKG_ORIGIN},)
 endif
 
 mandocs_install: all
-	install -D -m 644 ${DRIVER}.${MANSECTION}.gz ${INSTALL_MOD_PATH}/${MANDIR}/man${MANSECTION}/${DRIVER}.${MANSECTION}.gz
+	##install -D -m 644 ${DRIVER}.${MANSECTION}.gz ${INSTALL_MOD_PATH}/${MANDIR}/man${MANSECTION}/${DRIVER}.${MANSECTION}.gz
 
 # After installing all the files, perform necessary work to ensure the system
 # will use the new modules. This includes running depmod to update module
diff --git a/ice/ice_base.c b/ice/ice_base.c
index 84adc70..3a910f1 100644
--- a/ice/ice_base.c
+++ b/ice/ice_base.c
@@ -6,6 +6,11 @@
 #include "ice_dcb_lib.h"
 #include "ice_sriov.h"
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+#define NETMAP_ICE_BASE
+#include <ice_netmap_linux.h>
+#endif
+
 /**
  * __ice_vsi_get_qs_contig - Assign a contiguous chunk of queues to VSI
  * @qs_cfg: gathered variables needed for PF->VSI queues assignment
@@ -481,6 +486,10 @@ static int ice_setup_rx_ctx(struct ice_rx_ring *ring)
 	/* Rx queue threshold in units of 64 */
 	rlan_ctx.lrxqthresh = 1;
 
+#ifdef DEV_NETMAP
+	ice_netmap_preconfigure_rx_ring(ring, &rlan_ctx);
+#endif /* DEV_NETMAP */
+
 	/* Enable Flexible Descriptors in the queue context which
 	 * allows this driver to select a specific receive descriptor format
 	 * increasing context priority to pick up profile ID; default is 0x01;
@@ -638,6 +647,11 @@ int ice_vsi_cfg_rxq(struct ice_rx_ring *ring)
 		return 0;
 	}
 #endif /* HAVE_AF_XDP_ZC_SUPPORT */
+    
+#ifdef DEV_NETMAP
+	if (ice_netmap_configure_rx_ring(ring))
+		return 0;
+#endif /* DEV_NETMAP */
 
 	ice_alloc_rx_bufs(ring, num_bufs);
 
@@ -910,6 +924,10 @@ ice_vsi_cfg_txq(struct ice_vsi *vsi, struct ice_tx_ring *ring,
 	txq = &qg_buf->txqs[0];
 	if (pf_q == le16_to_cpu(txq->txq_id))
 		ring->txq_teid = le32_to_cpu(txq->q_teid);
+    
+#ifdef DEV_NETMAP
+	ice_netmap_configure_tx_ring(ring);
+#endif /* DEV_NETMAP */
 
 	return 0;
 }
diff --git a/ice/ice_main.c b/ice/ice_main.c
index a32bb2a..5b455c5 100644
--- a/ice/ice_main.c
+++ b/ice/ice_main.c
@@ -105,6 +105,11 @@ static unsigned long fwlog_events; /* no enabled events by default */
 module_param(fwlog_events, ulong, 0644);
 MODULE_PARM_DESC(fwlog_events, "FW events to log (32-bit mask)\n");
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+#define NETMAP_ICE_LIB
+#include <ice_netmap_linux.h>
+#endif
+
 /**
  * ice_hw_to_dev - Get device pointer from the hardware structure
  * @hw: pointer to the device HW structure
@@ -6835,6 +6840,7 @@ static int ice_init_devlink(struct ice_pf *pf)
 	if (need_register)
 		ice_devlink_register(pf);
 #endif /* !HAVE_DEVLINK_PARAMS_PUBLISH */
+
 	return 0;
 }
 
@@ -7116,6 +7122,11 @@ ice_probe(struct pci_dev *pdev, const struct pci_device_id __always_unused *ent)
 	err = ice_init_features(pf);
 	if (err)
 		goto err_init_features;
+
+#ifdef DEV_NETMAP
+	ice_netmap_attach(pf);
+#endif
+
 	return 0;
 
 err_init_features:
@@ -7208,6 +7219,10 @@ static void ice_remove(struct pci_dev *pdev)
 	if (!pf)
 		return;
 
+#ifdef DEV_NETMAP
+	ice_netmap_detach(pf);
+#endif /* DEV_NETMAP */
+
 	set_bit(ICE_SHUTTING_DOWN, pf->state);
 	/* ICE_PREPPED_RECOVERY_MODE is set when the up and running
 	 * driver transitions to recovery mode. If this is not set
diff --git a/ice/ice_txrx.c b/ice/ice_txrx.c
index 582e2cf..f5e07bd 100644
--- a/ice/ice_txrx.c
+++ b/ice/ice_txrx.c
@@ -32,6 +32,10 @@
 #define FDIR_DESC_RXDID 0x40
 #define ICE_FDIR_CLEAN_DELAY 10
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+#include <ice_netmap_linux.h>
+#endif
+
 /**
  * ice_prgm_fdir_fltr - Program a Flow Director filter
  * @vsi: VSI to send dummy packet
@@ -237,6 +241,10 @@ static bool ice_clean_tx_irq(struct ice_tx_ring *tx_ring, int napi_budget)
 	s16 i = tx_ring->next_to_clean;
 	struct ice_tx_desc *tx_desc;
 	struct ice_tx_buf *tx_buf;
+#ifdef DEV_NETMAP
+    if (tx_ring->netdev && netmap_tx_irq(tx_ring->netdev, tx_ring->q_index) != NM_IRQ_PASS)
+        return true;
+#endif /* DEV_NETMAP */
 
 	/* get the bql data ready */
 #ifdef HAVE_XDP_SUPPORT
@@ -1670,6 +1678,16 @@ int ice_clean_rx_irq(struct ice_rx_ring *rx_ring, int budget)
 #endif
 	bool failure;
 
+#ifdef DEV_NETMAP
+    if (rx_ring->netdev) {
+        int dummy, nm_irq;
+        nm_irq = netmap_rx_irq(rx_ring->netdev, rx_ring->q_index, &dummy);
+        if (nm_irq != NM_IRQ_PASS) {
+            return 1;
+        }
+    }
+#endif /* DEV_NETMAP */
+
 #ifndef CONFIG_ICE_USE_SKB
 #ifdef HAVE_XDP_SUPPORT
 #ifdef HAVE_XDP_BUFF_RXQ
